package com.dlyk.config.converter;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.dlyk.config.holder.ApplicationContextHolder;
import com.dlyk.model.Activity;
import com.dlyk.service.ActivityService;

import java.util.List;

/**
 * 市场活动转换器（通过Bean获取数据）
 */
public class ActivityConverter implements Converter<Integer> {

    /**
     * EasyExcel中的对象是手动new出来的不被Spring容器管理，所以这里无法注入Bean
     * 需要在 程序启动的时候 或者 调度定时任务 将数据写入到内存当中，然后在这里或其他EasyExcel的类使用的时候，从内存当中取出数据
     *
     * 如果不想将数据写入到内存当中，可以自定义一个被Spring容器管理的应用上下文持有器 ApplicationContextHolder ，实现 ApplicationContextAware接口，并实现setApplicationContext()方法
     * 在ApplicationContextHolder类中，定义一个静态的ApplicationContext类型的变量，在setApplicationContext()方法中为其赋值，然后在该类中自定义一个静态方法getApplicationContext()，通过这个方法获取应用上下文
     * 然后可以通过应用上下文获取Bean对象，applicationContext.getBean("Bean的名字")
     */

    @Override
    public Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {

        // 获取单元格的数据（Excel中市场活动名称的格式为：名称-id  例如：抖音推广-7）
        String cellActivity = cellData.getStringValue();

        // 截取字符串获取市场活动的名称和id
        String[] activityArray = cellActivity.split("-");
        String name = activityArray[0];
        Integer id = Integer.parseInt(activityArray[1]);

        // 需要往数据库中存储的是市场活动的id，但是市场活动名称会重复，所以需要同时验证名称和id，只有名称和id都一致，才能保证数据正确

        // 通过上下文持有器获取上下文，然后通过Bean的名字获取Bean
        ActivityService activityService = ApplicationContextHolder.getApplicationContext().getBean("activityServiceImpl", ActivityService.class);

        // 查询出所有正在进行的市场活动
        List<Activity> allOngoingActivityList = activityService.getAllOngoingActivity();

        // 遍历所有正在进行的市场活动
        for (Activity activity : allOngoingActivityList) {
            // 判断市场活动的名称和id是否都一致
            if (activity.getName().equals(name) && activity.getId().equals(id)) {
                return id;
            }
        }

        return -1;
    }
}

